/*
wt901c485.h
offer sensor type defined and function api
designed by lunanting

-----------------------
2021-02-19 14:00:29
create file
-----------------------

*/
#include "../../bsp/bsp.h"


//g value 
#define G_value     9.8     //m/s2
#define V_value     32768.0


//register address define
//set  0x06
#define ADDR_restart        0x0000  //重启
#define ADDR_sleep          0x0022  //休眠
#define ADDR_algorithm      0x0024  //几轴算法
#define ADDR_dir            0x0023  //安装方向
#define ADDR_start_type     0x002d  //启动方式
#define ADDR_adjust         0x0001  //校准
#define ADDR_gyro_auto      0x0063  //陀螺仪自动校准
#define ADDR_acc_rang       0x0021  //加速度范围设定
#define ADDR_deg_rang       0x0020  //最大角速度设定
#define ADDR_freq           0x001f  //带宽设定
#define ADDR_baud           0x0004  //波特率设定
#define ADDR_id             0x001a  //modbus地址设定
//read x 0x03
#define ADDR_time           0x0030  //时间
#define ADDR_acc            0x0034  //加速度 x-y-z
#define ADDR_deg            0x0037  //角速度 x-y-z
#define ADDR_angle          0x003d  //角度 x-y-z
#define ADDR_mag            0x003a  //磁场 x-y-z
#define ADDR_high           0x0045  //气压高度 P-H
#define ADDR_port           0x0041  //端口 0-1-2-3
#define ADDR_q              0x0051  //四元素 0-1-2-3
#define ADDR_l              0x0049  //经纬度 lon-lat



/****************************type define*****************************/
//algorithm type
typedef enum{
    wt901c_6,
    wt901c_9,
}WT_901C_type;

//sensor dir
typedef enum{
    wt901c_h,
    wt901c_s,
}WT901C_dir;

//max deg type
typedef enum{
    wt901c_deg_250,
    wt901c_deg_500,
    wt901c_deg_1000,
    wt901c_deg_2000,
}WT901C_max_deg;

//max acc type
typedef enum{
    wt901c_acc_2g,
    wt901c_acc_4g,
    wt901c_acc_8g,
    wt901c_acc_16g,
}WT901C_max_acc;

//freq type
typedef enum{
    wt901c_freq_256hz,
    wt901c_freq_184hz,
    wt901c_freq_94hz,
    wt901c_freq_44hz,
    wt901c_freq_21hz,
    wt901c_freq_10hz,
    wt901c_freq_5hz,
}WT901C_freq;

//baud speed
typedef enum{
    wt901c_baud_2400,
    wt901c_baud_4800,
    wt901c_baud_9600,
    wt901c_baud_19200,
    wt901c_baud_38400,
    wt901c_baud_57600,
    wt901c_baud_115200,
    wt901c_baud_230400,
    wt901c_baud_460800,
    wt901c_baud_921600,
}WT901C_baud;

//sensor type
typedef enum{
    wt901c_data_time,   //时间
    wt901c_data_acc,    //加速度
    wt901c_data_deg,    //角速度
    wt901c_data_angle,  //角度
    wt901c_data_mag,    //磁场
    wt901c_data_ph,     //气压高度
    wt901c_data_port,   //端口
    wt901c_data_q,      //四元素
    wt901c_data_l,      //经纬度
}WT901C_data_type;


//acc data  加速度   :m/s2
typedef struct{
    float x;
    float y;
    float z;
}WT901C_acc;
//deg data 角速度     :*/s
typedef struct{
    float x;
    float y;
    float z;
}WT901c_deg;
//angle data  角度      :*
typedef struct{
    float x;    //roll
    float y;    //pitch
    float z;    //yaw
    float offset_x;   //offset
    float offset_y;
    float offset_z;
    float rel_x;    //相对偏移量的角度
    float rel_y;
    float rel_z;
    float round_x;  //360 一圈的角度 相对角度
    float round_y;
    float round_z;
}WT901C_angle;
//mag data 磁场 :
typedef struct{
    s16 x;
    s16 y;
    s16 z;
}WT901C_mag;

//q0~q4 quatment  四元素
typedef struct{
    float q0;
    float q1;
    float q2;
    float q3;
}WT_901C_qua;

//wt901c sensor 
typedef struct{
    int init;   //obj init status,1=inited,0=uninit
    int port;   //uart port
    int speed;  //uart baud speed
    int id;     //modbus id
    float gMax;    //加速度量程
    int degMax;    //角速度量程
    int freq;      //更新带宽频率
    WT901C_acc acc;     //加速度
    WT901c_deg deg;     //角速度
    WT901C_mag mag;     //磁场
    WT901C_angle angle; //角度
    WT_901C_qua qua;    //四元素
}WT901C;



/******************************extern api******************************/
extern WT901C *xp_wt901c_init(int port,int speed,int id);   //wt901c sensor init
extern int xp_wt901c_config(WT901C *obj,int type,int dir,int gyro_adjust);  //config sensor
extern int xp_wt901c_set_deg(WT901C *obj,WT901C_max_deg type);  //config max deg
extern int xp_wt901c_set_acc(WT901C *obj,WT901C_max_acc type);  //config max acc
extern int xp_wt901c_set_freq(WT901C *obj,WT901C_freq type);    //config freq
extern int xp_wt901c_set_baud(WT901C *obj,WT901C_baud type);    //config baud speed
extern int xp_wt901c_set_id(WT901C *obj,int id);    //set modbus id

extern int xp_wt901c_read_sensor(WT901C *obj,WT901C_data_type type);    //read sensor


extern int xp_wt910c_demo_init(void);    //demo init
extern int xp_wt910c_demo2_init(void);  //demo2 init
extern int xp_wt901c_demo_zAngle_clear(void);//clear z angle
extern float xp_wt901c_demo_zAngle_get(void);   //get z angle

//end of the file
